--- /dev/null
+[Unit]
+Description=Disable GNOME Shell extensions after failure
+DefaultDependencies=no
+
+# Only disable extensions for a short period of time after login.
+# This means we err on the side of failing the first login after a broken
+# extension was installed.
+Requisite=gnome-session-stable.timer
+
+[Service]
+Type=simple
+# Disable extensions
+ExecStart=gsettings set org.gnome.shell disable-user-extensions true
+Restart=no
--- /dev/null
+[Unit]
+Description=GNOME Shell on Wayland
+# On wayland, force a session shutdown
+OnFailure=gnome-shell-disable-extensions.service gnome-session-shutdown.target
+OnFailureJobMode=replace-irreversibly
+CollectMode=inactive-or-failed
+RefuseManualStart=on
+RefuseManualStop=on
+
+After=gnome-session-manager.target
+
+Requisite=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session-initialized.target
+
+# The units already conflict because they use the same BusName
+#Conflicts=gnome-shell-x11.service
+
+[Service]
+Type=dbus
+ExecStart=@bindir@/gnome-shell
+# Exit code 1 means we are probably *not* dealing with an extension failure
+SuccessExitStatus=1
+# On wayland we cannot restart
+Restart=no
+BusName=org.gnome.Shell
[Unit]
-Description=GNOME Shell (wayland sync point)
-After=gnome-shell.service
-BindsTo=gnome-shell.service
-Conflicts=gnome-shell-x11.target
+Description=GNOME Shell on Wayland
+DefaultDependencies=no
+
+Requisite=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session-initialized.target
+
+Requires=gnome-shell-wayland.service
+After=gnome-shell-wayland.service
--- /dev/null
+[Unit]
+Description=GNOME Shell on X11
+# On X11, try to show the GNOME Session Failed screen
+OnFailure=gnome-shell-disable-extensions.service gnome-session-failed.target
+OnFailureJobMode=replace
+CollectMode=inactive-or-failed
+RefuseManualStart=on
+RefuseManualStop=on
+
+After=gnome-session-manager.target
+
+Requisite=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session-initialized.target
+
+# The units already conflict because they use the same BusName
+#Conflicts=gnome-shell-wayland.service
+
+# Limit startup frequency more than the default
+StartLimitIntervalSec=15s
+StartLimitBurst=3
+
+[Service]
+Type=dbus
+ExecStart=@bindir@/gnome-shell
+# Exit code 1 means we are probably *not* dealing with an extension failure
+SuccessExitStatus=1
+# On X11 we want to restart on-success (Alt+F2 + r) and on-failure.
+Restart=always
+# Do not wait before restarting the shell
+RestartSec=0ms
+BusName=org.gnome.Shell
[Unit]
-Description=GNOME Shell (x11 sync point)
-After=gnome-shell.service
-BindsTo=gnome-shell.service
-Conflicts=gnome-shell-wayland.target
+Description=GNOME Shell on X11
+DefaultDependencies=no
+
+Requisite=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session-initialized.target
+
+Requires=gnome-shell-x11.service
+After=gnome-shell-x11.service
+++ /dev/null
-[Unit]
-Description=GNOME Shell
-Wants=gnome-session.service
-After=graphical-session-pre.target gnome-session-bus.target
-PartOf=graphical-session.target
-
-[Service]
-Type=dbus
-ExecStart=@bindir@/gnome-shell
-Restart=on-failure
-BusName=org.gnome.Shell
unitconf = configuration_data()
unitconf.set('bindir', bindir)
- unit = configure_file(
- input: 'gnome-shell.service.in',
- output: 'gnome-shell.service',
+ configure_file(
+ input: 'gnome-shell-x11.service.in',
+ output: 'gnome-shell-x11.service',
+ configuration: unitconf,
+ install_dir: systemduserunitdir
+ )
+
+ configure_file(
+ input: 'gnome-shell-wayland.service.in',
+ output: 'gnome-shell-wayland.service',
configuration: unitconf,
install_dir: systemduserunitdir
)
- units = files('gnome-shell-wayland.target',
- 'gnome-shell-x11.target')
+ units = files('gnome-shell-x11.target',
+ 'gnome-shell-wayland.target',
+ 'gnome-shell-disable-extensions.service')
install_data(units, install_dir: systemduserunitdir)
endif